#include<iostream>
#include<vector>

using namespace std ;

const int maxn = 11 ;
int n ;
int path[maxn] ;
bool st[maxn] ;
int count ;
vector<int> list[maxn] ;

void perm(int x ) {
    if(x == n ){
        count ++ ;
        for (int i = 0; i < n; ++i) {
            printf("%d " , path[i]);
        }

        printf("\n");
        return ;
    }

    for(int i = 1 ; i <= n ; i++) {
        if(!st[i]) {
            bool flag = true ;  //可以继续插
            //如果当前这个可以插进去的话
            //就在插进去之前检查一下前面的列是否跟即将插进去的有冲突
            for(int k = 0 ; k < x ; k ++) {
                if(abs(k - x) == abs(path[k] - i)) {
                    flag = false ;  //不可以继续插了
                    break;
                }
            }
            if(flag){
                path[x] = i ;
                st[i] = true ;
                perm(x + 1);
                st[i] = false ;
            }
        }
    }
}

int main() {

    scanf("%d" , &n );
    perm(0);
    printf("%d", count );
    return 0 ;
}